package come.bjpowernode.javase.io;

import come.bjpowernode.javase.bean.Student;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
/*
1、java.io.NotSerializableException
    Student对象不支持序列化！！！！！！
2、参与序列化和反序列化的对象必须实现Serializable接口。

3、通过源代码发现，Serializable只是一个标志接口：
    public interface Serializable {
    }
    这个接口里面什么代码都没有。
    那么它起到什么作用呢？
        起到标志/表示作用，JVM看到这个标识后，可能会对其有特殊待遇。
        JVM看到这个标识后，会为该类生成一个系列化版本号。
 4、序列化版本号有什么用？
 java.io.InvalidClassException:
 come.bjpowernode.javase.bean.Student;
 local class incompatible: stream classdesc
 serialVersionUID = 4339939151026322526（十年后）,
 local class serialVersionUID = 2872596899181487067(十年前)

 java语言中是采用什么机制来区分类的：
    1、首先通过类名来进行比对，如果类名不一样，那肯定不是一个类。
    2、如果类名一样，在怎么进行类的区分，考序列化版本号区分。

 A编写了一个类：com.bjpowernode.javase.Studet implements Serializable
 B编写了一个类：com.bjpowernode.javase.Studet implements Serializable
 不同的人编写了同一个类，但是这两个类确实不是同一个类，这个时候序列化版本号就
 作用上了。对于java虚拟机来说，java虚拟机是可以区分开来这两个类的，因为这两个类
 实现了Serializable接口，都有默认的序列化版本号，他们的序列化版本号不一样，
 被区分开来了。

 请思考：这种自动生成序列化版本号有什么缺陷？
    不可以修改代码。
 最终结论，凡是一个类实现Serializable接口，建议给该类提供一个不变的固定的
         序列化版本号，这样即使后续修改了这个类，序列号不会改变。
 */
public class ObjectOutputStreamTest01 {
    public static void main(String[] args) throws Exception {
        //创建Object对象
        Student s1 = new Student(1111,"zhangsan");
        Student s2 = new Student(2222,"lisi");
        //序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("students"));

        //序列化对象
        oos.writeObject(s1);
        oos.writeObject(s2);
        //刷新
        oos.flush();
        //关闭
        oos.close();
    }
}
